﻿using System.Collections;
using UnityEngine;

namespace Mirror.Examples.MultipleMatch
{
    [AddComponentMenu("")]
    public class MatchNetworkManager : NetworkManager
    {
        [Header("Match GUI")]
        public GameObject canvas; // 聊天界面的 UI 面板
        public CanvasController canvasController; // CanvasController 组件

        public static new MatchNetworkManager singleton { get; private set; } // 只允许有一个 MatchNetworkManager 的实例

        /// <summary>
        /// 在服务器和客户端上都调用，网络尚未初始化时调用
        /// </summary>
        public override void Awake()
        {
            base.Awake();
            singleton = this;
            canvasController.InitializeData(); // 初始化 CanvasController 中的数据
        }

        #region 服务器回调函数

        /// <summary>
        /// 当客户端准备就绪时，在服务器上调用此函数
        /// </summary>
        /// <param name="conn">来自客户端的连接</param>
        public override void OnServerReady(NetworkConnectionToClient conn)
        {
            Debug.Log(111);
            base.OnServerReady(conn);
            canvasController.OnServerReady(conn); // 让 CanvasController 处理 OnServerReady 的逻辑
        }

        /// <summary>
        /// 当客户端断开连接时，在服务器上调用此函数
        /// </summary>
        /// <param name="conn">来自客户端的连接</param>
        public override void OnServerDisconnect(NetworkConnectionToClient conn)
        {
            Debug.Log(222);
            StartCoroutine(DoServerDisconnect(conn)); // 等待协程完成后再继续执行
        }

        IEnumerator DoServerDisconnect(NetworkConnectionToClient conn)
        {
            Debug.Log(333);
            yield return canvasController.OnServerDisconnect(conn); // 让 CanvasController 处理 OnServerDisconnect 的逻辑
            base.OnServerDisconnect(conn);
        }

        #endregion

        #region 客户端回调函数

        /// <summary>
        /// 当客户端连接到服务器时，在客户端上调用此函数
        /// </summary>
        public override void OnClientConnect()
        {
            Debug.Log(444);
            base.OnClientConnect();
            canvasController.OnClientConnect(); // 让 CanvasController 处理 OnClientConnect 的逻辑
        }

        /// <summary>
        /// 当客户端与服务器断开连接时，在客户端上调用此函数
        /// </summary>
        public override void OnClientDisconnect()
        {
            Debug.Log(555);
            canvasController.OnClientDisconnect(); // 让 CanvasController 处理 OnClientDisconnect 的逻辑
            base.OnClientDisconnect();
        }

        #endregion

        #region 开始和停止回调函数

        /// <summary>
        /// 在服务器启动时调用此函数（包括主机模式）
        /// </summary>
        public override void OnStartServer()
        {
            Debug.Log(666);
            if (mode == NetworkManagerMode.ServerOnly)
                canvas.SetActive(true); // 显示聊天界面的 UI 面板

            canvasController.OnStartServer(); // 让 CanvasController 处理 OnStartServer 的逻辑
        }

        /// <summary>
        /// 在客户端启动时调用此函数
        /// </summary>
        public override void OnStartClient()
        {
            Debug.Log(777);
            canvas.SetActive(true); // 显示聊天界面的 UI 面板
            canvasController.OnStartClient(); // 让 CanvasController 处理 OnStartClient 的逻辑
        }

        /// <summary>
        /// 在服务器停止时调用此函数
        /// </summary>
        public override void OnStopServer()
        {
            Debug.Log(888);
            canvasController.OnStopServer(); // 让 CanvasController 处理 OnStopServer 的逻辑
            canvas.SetActive(false); // 隐藏聊天界面的 UI 面板
        }

        /// <summary>
        /// 在客户端停止时调用此函数
        /// </summary>
        public override void OnStopClient()
        {
            Debug.Log(999);
            canvasController.OnStopClient(); // 让 CanvasController 处理 OnStopClient 的逻辑
        }

        #endregion
    }
}